package com.qfedu.aunt.commons.aop;

import com.qfedu.aunt.commons.service.BehaviorService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author xiaobobo
 * @title: Aop
 * @projectName aunt_commons_2209
 * @description: TODO
 * @date 2022/11/15  15:20
 */
@Component  //可以将这个切面类 放到IOC容器中去
@Aspect     //这个表示的是这个一个切面类
@Slf4j
public class Aop {

    @Autowired
    private BehaviorService behaviorService;

    /**
     * 这里用来做用户的行为记录
     */
    @Around(value = "execution(* com.qfedu.aunt.commons.controller.*.*(..)) && @annotation(behaviorLog)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint,BehaviorLog behaviorLog) throws Throwable {
        //这里是否有解决方案? ThreadLocal
        //记录啥?   谁  在什么时候  调用了什么模块  中的  什么方法 成功还是失败....
        //谁？怎么来获取 token
        //这里来记录吗?
        log.info("行为记录:调用之前...");
        String behaviorId=behaviorService.add(proceedingJoinPoint,behaviorLog);
        //这里的位置就是控制器中方法调用之前
        Object reuslt=null;
        try{
            reuslt=proceedingJoinPoint.proceed();
        }catch (Exception err){
            //程序执行到这里 说明产生了异常
            //更新数据
            log.info("行为记录:出现异常");
            behaviorService.updateBehavior(behaviorId,3);
        }
        log.info("行为记录:调用之后");
        //这个位置 就是控制器中方法调用之后
        //执行到这里说明是成功的
        behaviorService.updateBehavior(behaviorId,2);

        return reuslt;
    }
}
